/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Biblioteca;

import ClassesUnicas.ComboBoxMultiData;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Properties;
import javax.swing.JComponent;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JInternalFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.KeyStroke;
import java.awt.Toolkit;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.swing.JComboBox;

/**
 * Library
 *
 * Versao 1.0
 *
 * Data 24/01/2013
 *
 * @author Severo
 */
public abstract class Library {
    //Outros Metodos  
    /**
     * * Centraliza o Frame ou internalFrame passado como parametro
     *
     * @param frame se for passado, ira centralizar o Frame de acordo com o
     * Screen
     * @param internalFrame se for passado, ira centralizar o internalFrame de
     * acordo com o JDesktopPane
     * @param desktopPane serve de parametro para centralizar o internalFrame
     */
    public static void centralizarFrameOrInternalFrame(JFrame frame, javax.swing.JDesktopPane desktopPane, JInternalFrame internalFrame) {
        Toolkit tk = Toolkit.getDefaultToolkit();
        Dimension screenSize = tk.getScreenSize();

        if (internalFrame == null) {
            int screenWidth = screenSize.width - frame.getWidth();
            int screenHeigth = screenSize.height - frame.getHeight();
            frame.setLocation(screenWidth / 2, screenHeigth / 2);
        } else {
            int screenWidth = desktopPane.getWidth() - internalFrame.getWidth();
            int screenHeigth = desktopPane.getHeight() - internalFrame.getHeight();
            internalFrame.setLocation(screenWidth / 2, screenHeigth / 2);
        }
    }

    /**
     * Pega a versao do software no arquivo de configuracao
     *
     * @return
     */
    public static String getConfigTREF(String valor) {
        Properties config = new Properties();
        String arquivoProperties = "./configTREF.properties";
        try {
            config.load(new FileInputStream(arquivoProperties));
        } catch (IOException ex) {

        }

        return config.getProperty(valor);
    }

    /**
     * Faz com que o botao, passado como parametro, reaja ao clique de ENTER com
     * um clique normal
     *
     * @param cmpt
     */
    public static void reagirEnter(JComponent cmpt) {
        cmpt.registerKeyboardAction(
                cmpt.getActionForKeyStroke(
                        KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, 0, false)),
                KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0, false),
                JComponent.WHEN_FOCUSED
        );

        cmpt.registerKeyboardAction(
                cmpt.getActionForKeyStroke(
                        KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, 0, true)),
                KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0, true),
                JComponent.WHEN_FOCUSED
        );
    }

    /**
     * Limpa todos JTextField que sao componentes do JPanel
     *
     * @param panel
     */
    public static void limpaTextos(JPanel panel) {
        //Todos os componentes do Painel do Frame  
        Component components[] = panel.getComponents();
        for (Component component : components) {
            //É campo de texto?
            if (component instanceof JTextField) {
                //Está preenchido?
                ((JTextField) component).setText("");
            } else if (component instanceof JComboBox) {
                ((JComboBox) component).setSelectedIndex(0);
            } else if (component instanceof JPanel) {
                limpaTextos(((JPanel) component));
            }
        }
    }

    /**
     * Cria o JInternalFrame dentro de um JDialog modal, simulando um
     * JIternalFrame modal
     *
     * @param dlg
     * @param internalFrame
     */
    public static void criaInternalFrameDentroDialog(JDialog dlg, JInternalFrame internalFrame) {
        dlg.setTitle(internalFrame.getTitle());
        //Faz o JDialog receber os mesmo dados do JIternalFrame
        dlg.setContentPane(internalFrame.getContentPane());
        //Redimensiona
        dlg.setSize(internalFrame.getWidth(), internalFrame.getHeight() + 5); //+5, pois estava cortando uma parte da tela
        //Impede que o usuario redimensione a tela
        dlg.setResizable(false);
        //Centraliza
        dlg.setLocationRelativeTo(null);
        dlg.setModal(true);
        dlg.setVisible(true);
    }

    /**
     * Impede a digitacao de caracteres especiais, permite a digitacao apenas
     * dos caracters especificado no metodo permite o @ e o _
     *
     * @param textField
     */
    public static void semCaracterEspecial(JTextField textField) {
        textField.addKeyListener(new KeyListener() {
            @Override
            public void keyTyped(KeyEvent arg0) {
                char c = arg0.getKeyChar();
                if (!((c >= 48) && (c <= 57) //de 0 ate 9
                        || (c == 64) //@
                        || (c == 46) //.
                        || (c >= 65) && (c <= 90) //de a ate z
                        || (c == 95) //_
                        || (c >= 97) && (c <= 122) // de A ate Z
                        || (c == KeyEvent.VK_BACK_SPACE)
                        || (c == KeyEvent.VK_DELETE)
                        || (c == KeyEvent.VK_ENTER)
                        || (c == KeyEvent.VK_SPACE))) {
                    arg0.consume();
                    //JOptionPane.showMessageDialog(null, (int) c, "Atenção!", JOptionPane.INFORMATION_MESSAGE);
                }
            }

            @Override
            public void keyPressed(KeyEvent e) {
            }

            @Override
            public void keyReleased(KeyEvent e) {
            }
        });
    }

    /**
     * Impede a digitacao da BarraDeEspaco
     *
     * @param textField
     */
    public static void semBarraDeEspaco(JTextField textField) {
        textField.addKeyListener(new KeyListener() {
            @Override
            public void keyTyped(KeyEvent arg0) {
                char c = arg0.getKeyChar();
                if ((c == KeyEvent.VK_SPACE)) {
                    arg0.consume();
                }
            }

            @Override
            public void keyPressed(KeyEvent e) {
            }

            @Override
            public void keyReleased(KeyEvent e) {
            }
        });
    }

    /**
     * Permite a digitacao apenas de numeros
     *
     * @param textField
     */
    public static void somenteNumeros(JTextField textField) {
        textField.addKeyListener(new KeyListener() {
            @Override
            public void keyTyped(KeyEvent arg0) {
                char c = arg0.getKeyChar();
                if (!((c >= 48) && (c <= 57))) {//de 0 ate 9
                    arg0.consume();
                    //JOptionPane.showMessageDialog(null, (int) c, "Atenção!", JOptionPane.INFORMATION_MESSAGE);
                }
            }

            @Override
            public void keyPressed(KeyEvent e) {
            }

            @Override
            public void keyReleased(KeyEvent e) {
            }
        });
    }

    /**
     * Valida o CPF
     *
     * @param cpf
     * @return
     */
    public static boolean validaCPF(String cpf) {
        String strCpf = cpf;
        if (strCpf.equals("")) {
            return false;
        }

        int d1, d2;
        int digito1, digito2, resto;
        int digitoCPF;
        String nDigResult;

        d1 = d2 = 0;
        digito1 = digito2 = resto = 0;

        for (int nCount = 1; nCount < strCpf.length() - 1; nCount++) {
            digitoCPF = Integer.valueOf(strCpf.substring(nCount - 1, nCount)).intValue();

            //multiplique a ultima casa por 2 a seguinte por 3 a seguinte por 4 e assim por diante.  
            d1 = d1 + (11 - nCount) * digitoCPF;

            //para o segundo digito repita o procedimento incluindo o primeiro digito calculado no passo anterior.  
            d2 = d2 + (12 - nCount) * digitoCPF;
        }

        //Primeiro resto da divisão por 11.  
        resto = (d1 % 11);

        //Se o resultado for 0 ou 1 o digito é 0 caso contrário o digito é 11 menos o resultado anterior.  
        if (resto < 2) {
            digito1 = 0;
        } else {
            digito1 = 11 - resto;
        }

        d2 += 2 * digito1;

        //Segundo resto da divisão por 11.  
        resto = (d2 % 11);

        //Se o resultado for 0 ou 1 o digito é 0 caso contrário o digito é 11 menos o resultado anterior.  
        if (resto < 2) {
            digito2 = 0;
        } else {
            digito2 = 11 - resto;
        }

        //Digito verificador do CPF que está sendo validado.  
        String nDigVerific = strCpf.substring(strCpf.length() - 2, strCpf.length());

        //Concatenando o primeiro resto com o segundo.  
        nDigResult = String.valueOf(digito1) + String.valueOf(digito2);

        //comparar o digito verificador do cpf com o primeiro resto + o segundo resto.  
        return nDigVerific.equals(nDigResult);
    }

    /**
     * Localiza o indice no comboBox da linha com mesmo texto
     *
     * @param comboBox
     * @param texto
     * @return
     */
    public static int localizaIndiceComboBox(JComboBox comboBox, String texto) {
        for (int i = 0; i < comboBox.getItemCount(); i++) {
            if (comboBox.getItemAt(i) instanceof ComboBoxMultiData) {
                if (((ComboBoxMultiData) comboBox.getItemAt(i)).toString().equals(texto)) {
                    return i;
                } else if (comboBox.getSelectedItem() instanceof String) {
                    if (((String) comboBox.getItemAt(i)).equals(texto)) {
                        return i;
                    }

                }
            }
        }
        return 0;
    }

    /**
     * Localiza o indice no comboBox da linha com mesmo texto
     *
     * @param comboBox
     * @param texto
     * @return
     */
    public static int localizaIndiceComboBox(JComboBox comboBox, long codigo) {
        for (int i = 0; i < comboBox.getItemCount(); i++) {
            if (comboBox.getItemAt(i) instanceof ComboBoxMultiData) {
                if (((ComboBoxMultiData) comboBox.getItemAt(i)).getCodigo1() == codigo) {
                    return i;
                }
            }
        }
        return 0;
    }

    /**
     * Valida data
     * @param data
     * @return 
     */
    public static boolean validaData(String data) {
        SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
        sdf.setLenient(false);

        try {
            Date dataTestatda = sdf.parse(data);
            // se passou pra cá, é porque a data é válida
        } catch (ParseException e) {
            // se cair aqui, a data é inválida
            return false;
        }
        return true;
    }
}
